--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
electron/loadingStatusNotice.js 3f7ef731b5effd9aa3a81eceea66fd6c2b56498c (3f7ef731) Text, 10.42 KB
Tb4b4b4(Tff7b72function Tb4b4b4(Te6edf3rootTb4b4b4, Te6edf3factoryTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3exported Tff7b72= Te6edf3factoryTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72typeof Te6edf3module Tff7b72!== Ta5d6ff"undefined" Tff7b72&& Te6edf3moduleTb4b4b4.Te6edf3exportsTb4b4b4) Tb4b4b4{
Te6edf3moduleTb4b4b4.Te6edf3exports Tff7b72= Te6edf3exportedTb4b4b4;
Tb4b4b4}
Te6edf3rootTb4b4b4.Te6edf3MeshchatLoadingStatusNotice Tff7b72= Te6edf3exportedTb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4(Tff7b72typeof Tffa657globalThis Tff7b72!== Ta5d6ff"undefined" Tff7b72? Tffa657globalThis Tff7b72: Tffa657windowTb4b4b4, Tff7b72function Tb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72function Te6edf3toLowerTextTb4b4b4(Te6edf3valueTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3value Tff7b72== Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff""Tb4b4b4;
Tb4b4b4}
Tff7b72return Tffa657StringTb4b4b4(Te6edf3valueTb4b4b4)Tb4b4b4.Te6edf3toLowerCaseTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72function Te6edf3parseMemoryLogLineTb4b4b4(Te6edf3textTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3text Tff7b72|| Tff7b72typeof Te6edf3text Tff7b72!== Ta5d6ff"string"Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3rawLine Tff7b72of Te6edf3textTb4b4b4.Te6edf3splitTb4b4b4(Ta5d6ff/\r?\n/Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3line Tff7b72= Te6edf3rawLineTb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3lineTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"MESHCHAT_MEMORY:"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72continueTb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3parsed Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4;
Tff7b72const Te6edf3payload Tff7b72= Te6edf3lineTb4b4b4.Te6edf3sliceTb4b4b4(Ta5d6ff"MESHCHAT_MEMORY:"Tb4b4b4.Te6edf3lengthTb4b4b4)Tb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3token Tff7b72of Te6edf3payloadTb4b4b4.Te6edf3splitTb4b4b4(Ta5d6ff/\s+/Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3idx Tff7b72= Te6edf3tokenTb4b4b4.Te6edf3indexOfTb4b4b4(Ta5d6ff"="Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3idx Tff7b72<= T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72continueTb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3key Tff7b72= Te6edf3tokenTb4b4b4.Te6edf3sliceTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3idxTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3value Tff7b72= Te6edf3tokenTb4b4b4.Te6edf3sliceTb4b4b4(Te6edf3idx Tff7b72+ T79c0ff1Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3key Tff7b72=== Ta5d6ff"total_mb" Tff7b72|| Te6edf3key Tff7b72=== Ta5d6ff"available_mb" Tff7b72|| Te6edf3key Tff7b72=== Ta5d6ff"percent_used"Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3num Tff7b72= Tffa657NumberTb4b4b4(Te6edf3valueTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tffa657NumberTb4b4b4.Tffa657isFiniteTb4b4b4(Te6edf3numTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3parsedTb4b4b4[Te6edf3keyTb4b4b4] Tff7b72= Te6edf3numTb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3parsedTb4b4b4[Te6edf3keyTb4b4b4] Tff7b72= Te6edf3valueTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72return Tffa657ObjectTb4b4b4.Te6edf3keysTb4b4b4(Te6edf3parsedTb4b4b4)Tb4b4b4.Te6edf3length Tff7b72> T79c0ff0 Tff7b72? Te6edf3parsed Tff7b72: Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
T8b949e/**
* @param {string} stderr
* @param {string} stdout
* @param {number|null|undefined} exitCode
* @returns {{ category: string, summary: string, hints: string[] }}
*/
Tff7b72function Te6edf3diagnoseBackendCrashTb4b4b4(Te6edf3stderrTb4b4b4, Te6edf3stdoutTb4b4b4, Te6edf3exitCodeTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3combined Tff7b72= Ta5d6ff`Tffd700${Te6edf3stdout Tff7b72|| Ta5d6ff""Tffd700}Ta5d6ff\nTffd700${Te6edf3stderr Tff7b72|| Ta5d6ff""Tffd700}Ta5d6ff`Tb4b4b4.Te6edf3toLowerCaseTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3rawCombined Tff7b72= Ta5d6ff`Tffd700${Te6edf3stdout Tff7b72|| Ta5d6ff""Tffd700}Ta5d6ff\nTffd700${Te6edf3stderr Tff7b72|| Ta5d6ff""Tffd700}Ta5d6ff`Tb4b4b4;
Tff7b72const Te6edf3hints Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3memoryLine Tff7b72= Te6edf3parseMemoryLogLineTb4b4b4(Te6edf3rawCombinedTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3memoryLineTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3available Tff7b72= Tffa657NumberTb4b4b4(Te6edf3memoryLineTb4b4b4.Te6edf3available_mbTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3action Tff7b72= Tffa657StringTb4b4b4(Te6edf3memoryLineTb4b4b4.Te6edf3action Tff7b72|| Ta5d6ff""Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3action Tff7b72=== Ta5d6ff"abort" Tff7b72|| Tb4b4b4(Tffa657NumberTb4b4b4.Tffa657isFiniteTb4b4b4(Te6edf3availableTb4b4b4) Tff7b72&& Te6edf3available Tff7b72< T79c0ff200Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3hintsTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff"Close other apps to free RAM, then relaunch."Tb4b4b4)Tb4b4b4;
Te6edf3hintsTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff"Try Emergency Mode if the device has 4 GB RAM or less."Tb4b4b4)Tb4b4b4;
Tff7b72return Tb4b4b4{
Te6edf3categoryTff7b72: Ta5d6ff"memory"Tb4b4b4,
Te6edf3summaryTff7b72: Tffa657NumberTb4b4b4.Tffa657isFiniteTb4b4b4(Te6edf3availableTb4b4b4)
Tff7b72? Ta5d6ff`Ta5d6ffThe backend reported critically low memory (Tffd700${Te6edf3availableTb4b4b4.Te6edf3toFixedTb4b4b4(T79c0ff0Tb4b4b4)Tffd700}Ta5d6ff MB available).Ta5d6ff`
Tff7b72: Ta5d6ff"The backend aborted startup due to critically low memory."Tb4b4b4,
Te6edf3hintsTb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3action Tff7b72=== Ta5d6ff"warn"Tb4b4b4) Tb4b4b4{
Te6edf3hintsTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff"Try Emergency Mode if the device has 4 GB RAM or less."Tb4b4b4)Tb4b4b4;
Tff7b72return Tb4b4b4{
Te6edf3categoryTff7b72: Ta5d6ff"memory"Tb4b4b4,
Te6edf3summaryTff7b72: Tffa657NumberTb4b4b4.Tffa657isFiniteTb4b4b4(Te6edf3availableTb4b4b4)
Tff7b72? Ta5d6ff`Ta5d6ffThe backend detected limited memory (Tffd700${Te6edf3availableTb4b4b4.Te6edf3toFixedTb4b4b4(T79c0ff0Tb4b4b4)Tffd700}Ta5d6ff MB available).Ta5d6ff`
Tff7b72: Ta5d6ff"The backend detected limited system memory during startup."Tb4b4b4,
Te6edf3hintsTb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72if Tb4b4b4(
Te6edf3combinedTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"memoryerror"Tb4b4b4) Tff7b72||
Te6edf3combinedTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"out of memory"Tb4b4b4) Tff7b72||
Te6edf3combinedTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"cannot allocate memory"Tb4b4b4)
Tb4b4b4) Tb4b4b4{
Te6edf3hintsTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff"Close other apps to free RAM, then relaunch."Tb4b4b4)Tb4b4b4;
Te6edf3hintsTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff"Try Emergency Mode if the device has 4 GB RAM or less."Tb4b4b4)Tb4b4b4;
Tff7b72return Tb4b4b4{
Te6edf3categoryTff7b72: Ta5d6ff"memory"Tb4b4b4,
Te6edf3summaryTff7b72: Ta5d6ff"The backend likely ran out of memory during startup."Tb4b4b4,
Te6edf3hintsTb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(
Te6edf3combinedTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"address already in use"Tb4b4b4) Tff7b72||
Te6edf3combinedTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"eaddrinuse"Tb4b4b4) Tff7b72||
Te6edf3combinedTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"only one usage of each socket"Tb4b4b4)
Tb4b4b4) Tb4b4b4{
Te6edf3hintsTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff"End any ReticulumMeshChatX.exe process in Task Manager, then relaunch."Tb4b4b4)Tb4b4b4;
Tff7b72return Tb4b4b4{
Te6edf3categoryTff7b72: Ta5d6ff"port-conflict"Tb4b4b4,
Te6edf3summaryTff7b72: Ta5d6ff"Port 9337 is already in use."Tb4b4b4,
Te6edf3hintsTb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(
Te6edf3combinedTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"eacces"Tb4b4b4) Tff7b72||
Te6edf3combinedTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"eperm"Tb4b4b4) Tff7b72||
Te6edf3combinedTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"permission denied"Tb4b4b4) Tff7b72||
Te6edf3combinedTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"access is denied"Tb4b4b4)
Tb4b4b4) Tb4b4b4{
Te6edf3hintsTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff"Ensure the MeshChatX data folder is writable."Tb4b4b4)Tb4b4b4;
Tff7b72return Tb4b4b4{
Te6edf3categoryTff7b72: Ta5d6ff"permission"Tb4b4b4,
Te6edf3summaryTff7b72: Ta5d6ff"The backend could not access a required file or folder."Tb4b4b4,
Te6edf3hintsTb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3combinedTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"!!! application crash detected !!!"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3hintsTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff"Open meshchatx.log for the full diagnostic trace from the crash recovery engine."Tb4b4b4)Tb4b4b4;
Tff7b72return Tb4b4b4{
Te6edf3categoryTff7b72: Ta5d6ff"python-crash"Tb4b4b4,
Te6edf3summaryTff7b72: Ta5d6ff"The backend crash recovery system reported a fatal Python error."Tb4b4b4,
Te6edf3hintsTb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3exitCode Tff7b72!= Tff7b72null Tff7b72&& Te6edf3exitCode Tff7b72!== T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3hintsTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff"Open the logs folder below and review meshchatx.log and last-backend-crash.json."Tb4b4b4)Tb4b4b4;
Tff7b72return Tb4b4b4{
Te6edf3categoryTff7b72: Ta5d6ff"exit-code"Tb4b4b4,
Te6edf3summaryTff7b72: Ta5d6ff`Ta5d6ffThe backend exited with code Tffd700${Te6edf3exitCodeTffd700}Ta5d6ff.Ta5d6ff`Tb4b4b4,
Te6edf3hintsTb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tff7b72return Tb4b4b4{
Te6edf3categoryTff7b72: Ta5d6ff"unknown"Tb4b4b4,
Te6edf3summaryTff7b72: Ta5d6ff"The backend stopped before the UI could connect."Tb4b4b4,
Te6edf3hintsTff7b72: Tb4b4b4[Ta5d6ff"Review the saved crash report and meshchatx.log for details."Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tff7b72function Te6edf3formatLogPathHintTb4b4b4(Te6edf3pathsTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3paths Tff7b72|| Tff7b72typeof Te6edf3paths Tff7b72!== Ta5d6ff"object"Tb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff""Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3pathsTb4b4b4.Te6edf3backendLogPathTb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff`Ta5d6ffLogs: Tffd700${Te6edf3pathsTb4b4b4.Te6edf3backendLogPathTffd700}Ta5d6ff`Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3pathsTb4b4b4.Te6edf3logsDirTb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff`Ta5d6ffLogs folder: Tffd700${Te6edf3pathsTb4b4b4.Te6edf3logsDirTffd700}Ta5d6ff`Tb4b4b4;
Tb4b4b4}
Tff7b72return Ta5d6ff""Tb4b4b4;
Tb4b4b4}
T8b949e/**
* @param {unknown[]} failures
* @param {object|null} runtimeState
* @param {object} options
* @returns {object}
*/
Tff7b72function Te6edf3classifyConnectionIssueTb4b4b4(Te6edf3failuresTb4b4b4, Te6edf3runtimeStateTb4b4b4, Te6edf3optionsTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3entries Tff7b72= Tffa657ArrayTb4b4b4.Te6edf3isArrayTb4b4b4(Te6edf3failuresTb4b4b4) Tff7b72? Te6edf3failures Tff7b72: Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3state Tff7b72= Te6edf3runtimeState Tff7b72&& Tff7b72typeof Te6edf3runtimeState Tff7b72=== Ta5d6ff"object" Tff7b72? Te6edf3runtimeState Tff7b72: Tff7b72nullTb4b4b4;
Tff7b72const Te6edf3opts Tff7b72= Te6edf3options Tff7b72&& Tff7b72typeof Te6edf3options Tff7b72=== Ta5d6ff"object" Tff7b72? Te6edf3options Tff7b72: Tb4b4b4{Tb4b4b4}Tb4b4b4;
Tff7b72const Te6edf3attemptCount Tff7b72= Tffa657NumberTb4b4b4(Te6edf3optsTb4b4b4.Te6edf3attemptCountTb4b4b4) Tff7b72|| T79c0ff0Tb4b4b4;
Tff7b72const Te6edf3networkWarnAfterAttempts Tff7b72= Tffa657NumberTb4b4b4(Te6edf3optsTb4b4b4.Te6edf3networkWarnAfterAttemptsTb4b4b4) Tff7b72|| T79c0ff24Tb4b4b4;
Tff7b72const Te6edf3crash Tff7b72= Te6edf3optsTb4b4b4.Te6edf3crash Tff7b72&& Tff7b72typeof Te6edf3optsTb4b4b4.Te6edf3crash Tff7b72=== Ta5d6ff"object" Tff7b72? Te6edf3optsTb4b4b4.Te6edf3crash Tff7b72: Tff7b72nullTb4b4b4;
Tff7b72const Te6edf3paths Tff7b72= Te6edf3optsTb4b4b4.Te6edf3paths Tff7b72&& Tff7b72typeof Te6edf3optsTb4b4b4.Te6edf3paths Tff7b72=== Ta5d6ff"object" Tff7b72? Te6edf3optsTb4b4b4.Te6edf3paths Tff7b72: Tff7b72nullTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3state Tff7b72&& Te6edf3stateTb4b4b4.Te6edf3running Tff7b72=== Tff7b72false Tff7b72&& Te6edf3stateTb4b4b4.Te6edf3lastExitCode Tff7b72!= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3diagnosis Tff7b72= Te6edf3diagnoseBackendCrashTb4b4b4(Te6edf3crashTff7b72?Tb4b4b4.Te6edf3stderr Tff7b72|| Ta5d6ff""Tb4b4b4, Te6edf3crashTff7b72?Tb4b4b4.Te6edf3stdout Tff7b72|| Ta5d6ff""Tb4b4b4, Te6edf3stateTb4b4b4.Te6edf3lastExitCodeTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3logHint Tff7b72= Te6edf3formatLogPathHintTb4b4b4(Te6edf3pathsTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3detailParts Tff7b72= Tb4b4b4[Te6edf3diagnosisTb4b4b4.Te6edf3summaryTb4b4b4, Tb4b4b4...Te6edf3diagnosisTb4b4b4.Te6edf3hintsTb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3logHintTb4b4b4) Tb4b4b4{
Te6edf3detailPartsTb4b4b4.Te6edf3pushTb4b4b4(Te6edf3logHintTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Tb4b4b4{
Te6edf3reasonTff7b72: Ta5d6ff"backend-exited"Tb4b4b4,
Te6edf3headlineTff7b72: Ta5d6ff"The backend process stopped unexpectedly."Tb4b4b4,
Te6edf3detailTff7b72: Te6edf3detailPartsTb4b4b4.Te6edf3joinTb4b4b4(Ta5d6ff" "Tb4b4b4)Tb4b4b4,
Te6edf3categoryTff7b72: Te6edf3diagnosisTb4b4b4.Te6edf3categoryTb4b4b4,
Te6edf3exitCodeTff7b72: Te6edf3stateTb4b4b4.Te6edf3lastExitCodeTb4b4b4,
Te6edf3hintsTff7b72: Te6edf3diagnosisTb4b4b4.Te6edf3hintsTb4b4b4,
Te6edf3logHintTb4b4b4,
Te6edf3crashTb4b4b4,
Te6edf3pathsTb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3hasAddressUnreachable Tff7b72= Te6edf3entriesTb4b4b4.Te6edf3someTb4b4b4(Tb4b4b4(Te6edf3entryTb4b4b4) Tb4b4b4=> Te6edf3entry Tff7b72&& Te6edf3entryTb4b4b4.Te6edf3kind Tff7b72=== Ta5d6ff"address-unreachable"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3hasAddressUnreachableTb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4{
Te6edf3reasonTff7b72: Ta5d6ff"loopback-blocked"Tb4b4b4,
Te6edf3headlineTff7b72: Ta5d6ff"Cannot reach local backend on 127.0.0.1:9337."Tb4b4b4,
Te6edf3detailTff7b72: Ta5d6ff"A firewall, VPN, sandbox, or loopback policy may be blocking local connections."Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3hasNetworkError Tff7b72= Te6edf3entriesTb4b4b4.Te6edf3someTb4b4b4(Tb4b4b4(Te6edf3entryTb4b4b4) Tb4b4b4=> Te6edf3entry Tff7b72&& Te6edf3entryTb4b4b4.Te6edf3kind Tff7b72=== Ta5d6ff"network-error"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3hasNetworkErrorTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3attemptCount Tff7b72< Te6edf3networkWarnAfterAttemptsTb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4{
Te6edf3reasonTff7b72: Ta5d6ff"starting"Tb4b4b4,
Te6edf3headlineTff7b72: Ta5d6ff"Waiting for backend startup."Tb4b4b4,
Te6edf3detailTff7b72: Ta5d6ff"MeshChatX is still initializing services."Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tff7b72return Tb4b4b4{
Te6edf3reasonTff7b72: Ta5d6ff"network-blocked"Tb4b4b4,
Te6edf3headlineTff7b72: Ta5d6ff"Still waiting for local backend connection."Tb4b4b4,
Te6edf3detailTff7b72: Ta5d6ff"If startup stays stuck, firewall or network filtering software may be blocking localhost traffic."Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3hasServerError Tff7b72= Te6edf3entriesTb4b4b4.Te6edf3someTb4b4b4(
Tb4b4b4(Te6edf3entryTb4b4b4) Tb4b4b4=> Te6edf3entry Tff7b72&& Te6edf3entryTb4b4b4.Te6edf3kind Tff7b72=== Ta5d6ff"http-error" Tff7b72&& Tffa657NumberTb4b4b4(Te6edf3entryTb4b4b4.Te6edf3statusTb4b4b4) Tff7b72>= T79c0ff500
Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3hasServerErrorTb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4{
Te6edf3reasonTff7b72: Ta5d6ff"backend-http-error"Tb4b4b4,
Te6edf3headlineTff7b72: Ta5d6ff"Backend is running but reported an internal error."Tb4b4b4,
Te6edf3detailTff7b72: Ta5d6ff"MeshChatX will keep retrying while the backend finishes startup."Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3hasInvalidPayload Tff7b72= Te6edf3entriesTb4b4b4.Te6edf3someTb4b4b4(Tb4b4b4(Te6edf3entryTb4b4b4) Tb4b4b4=> Te6edf3entry Tff7b72&& Te6edf3entryTb4b4b4.Te6edf3kind Tff7b72=== Ta5d6ff"invalid-payload"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3hasInvalidPayloadTb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4{
Te6edf3reasonTff7b72: Ta5d6ff"backend-invalid-response"Tb4b4b4,
Te6edf3headlineTff7b72: Ta5d6ff"Backend responded with invalid startup data."Tb4b4b4,
Te6edf3detailTff7b72: Ta5d6ff"MeshChatX will continue retrying while the backend stabilizes."Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tff7b72return Tb4b4b4{
Te6edf3reasonTff7b72: Ta5d6ff"starting"Tb4b4b4,
Te6edf3headlineTff7b72: Ta5d6ff"Waiting for backend startup."Tb4b4b4,
Te6edf3detailTff7b72: Ta5d6ff"MeshChatX is still initializing services."Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tff7b72function Te6edf3classifyFetchErrorTb4b4b4(Te6edf3errorTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3message Tff7b72= Ta5d6ff`Tffd700${Te6edf3toLowerTextTb4b4b4(Te6edf3error Tff7b72&& Te6edf3errorTb4b4b4.Te6edf3nameTb4b4b4)Tffd700}Ta5d6ff Tffd700${Te6edf3toLowerTextTb4b4b4(Te6edf3error Tff7b72&& Te6edf3errorTb4b4b4.Te6edf3messageTb4b4b4)Tffd700}Ta5d6ff`Tb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(
Te6edf3messageTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"err_address_unreachable"Tb4b4b4) Tff7b72||
Te6edf3messageTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"address_unreachable"Tb4b4b4) Tff7b72||
Te6edf3messageTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"ehostunreach"Tb4b4b4)
Tb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff"address-unreachable"Tb4b4b4;
Tb4b4b4}
Tff7b72return Ta5d6ff"network-error"Tb4b4b4;
Tb4b4b4}
Tff7b72return Tb4b4b4{
Te6edf3classifyConnectionIssueTb4b4b4,
Te6edf3classifyFetchErrorTb4b4b4,
Te6edf3diagnoseBackendCrashTb4b4b4,
Te6edf3formatLogPathHintTb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────